/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package lintulaskenta.servlet.havainnointi;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import lintulaskenta.entity.Havainnointitapahtuma;
import lintulaskenta.entity.Parvihavainto;
import lintulaskenta.entity.Lajihavainto;
import lintulaskenta.entity.Pistevuosi;
import lintulaskenta.pulautin.SyotteenTarkastaja;
import lintulaskenta.tipuapiValidointi.TipuApiValidator;

/**
 *
 * @author anna
 */
public class LomakkeenValidoija {
    
    private TipuApiValidator validoija;
    private ArrayList<String> virheet = new ArrayList<String>();
    private ArrayList<String> pisteidenVirheet = new ArrayList<String>();
        
    public LomakkeenValidoija() {
        try {
            validoija = new TipuApiValidator();
        } catch (FileNotFoundException ex) {
            Logger.getLogger(LomakkeenValidoija.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(LomakkeenValidoija.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public boolean validoiHavainnointitapahtuma(Havainnointitapahtuma ht, String havainnoija) {
        virheet = new ArrayList<String>();
        boolean ok = true;
        if (!tarkistaPaivays(ht.getPaiva(), ht.getKuukausi(), ht.getVuosi())) {
            ok = false;
        }
        if (!tarkistaHavainnoija(havainnoija)) {
            ok = false;
        }
        if (!tarkistaKunta(ht.getLaskentakunta())) {
            ok = false;
        }
        if (!validoiPistevuodet(ht)) {
            ok = false;
        }
        return ok;
    }
    
    // Tarkistaa, että jokaisella havainnointitapahtuman pistevuodella on biotooppi.
    public boolean validoiPistevuodet(Havainnointitapahtuma ht) {
        pisteidenVirheet = new ArrayList<String>();
        boolean ok = true;
        for (Pistevuosi p : ht.getPistevuodet()) {
            if (p.getBiotooppikoodiNyt() == 0) {
                pisteidenVirheet.add("Pisteeltä " + p.getPisteenJarjestysnumero() + " puuttuu nykyinen biotooppi!");
                ok = false;
            }
        }
        return ok;
    }

    // Tarkistaa, että lajihavainnon laji on validi (koodi on olemassa), lintumäärät ovat suurempia kuin nolla
    // ja että pisteellä ei ole ennestään samaa lajia lajihavainnoissa.
    public String tarkistaLajihavainto(Pistevuosi p, String lintulaji, String sisa, String ulko, String vanhalaji) {
        String virhe = "";
        SyotteenTarkastaja tarkastaja = new SyotteenTarkastaja();
        if (!validoija.tarkistaLintulaji(lintulaji.toUpperCase())) {
            virhe = virhe = " Virheellinen lintulaji!";
        }
        if (!tarkastaja.isANumber(sisa) || !tarkastaja.isANumber(ulko)) {
            virhe = virhe + " Virheellinen syöte  parimäärässä!";

        }
        if (tarkastaja.isANumber(sisa) && tarkastaja.isANumber(ulko)) {
            if (Integer.parseInt(ulko) <= 0 && Integer.parseInt(sisa) <= 0) {
                virhe = virhe + " Tarkista lajihavainnon parimäärä!";
            }
        }
        if (!vanhalaji.equalsIgnoreCase(lintulaji)) {
            for (Lajihavainto l : p.getLajihavainnot()) {
                if (l.getParvilaji().equalsIgnoreCase(lintulaji)) {
                    virhe = virhe + " Pisteellä on jo lajihavaintoja lajille " + lintulaji.toLowerCase() + "!";
                    break;
                }
            }
        }
        return virhe;
    }
    
    // Tarkistaa, että parvihavainnon laji on validi (koodi on olemassa), parvimäärä on suurempi kuin nolla
    // ja että pisteellä ei ole ennestään samaa lajia parvihavainnoissa.
        public String tarkistaParvihavainto(Pistevuosi p, String lintulaji, String maara, String vanhalaji) {
        String virhe = "";
        SyotteenTarkastaja tarkastaja = new SyotteenTarkastaja();
        if (!validoija.tarkistaLintulaji(lintulaji.toUpperCase())) {
            virhe = virhe = " Virheellinen lintulaji!";
        }
        if (!tarkastaja.isANumber(maara)) {
            virhe = virhe + " Virheellinen syöte parvikoossa!";

        }
        if (tarkastaja.isANumber(maara)) {
            if (Integer.parseInt(maara) <= 0) {
                virhe = virhe + " Virheellinen parvikoko!";
            }
        }
        if (!vanhalaji.equalsIgnoreCase(lintulaji)) {
            for (Parvihavainto ph : p.getParvihavainnot()) {
                if (ph.getParvilaji().equalsIgnoreCase(lintulaji)) {
                    virhe = virhe + " Pisteellä on jo parvihavaintoja lajille " + lintulaji.toLowerCase() + "!";
                    break;
                }
            }
        }
        return virhe;
    }
    
    // Tarkistaa, että kyseinen lintulajikoodi on olemassa.
    public boolean tarkistaLintulaji(String lintu) {
        if(!validoija.tarkistaLintulaji(lintu)) {
            virheet.add("Virheellinen lintulaji!");
            return false;
        }
        return true;
    }
    
    // Tarkistaa, että parvikoko on annettu ja että se on enemmän kuin nolla.
    public boolean tarkistaParvihavainnonKoko(int koko) {
        if (koko <= 0) {
            pisteidenVirheet.add("Virheellinen parvihavainnon koko!");
            return false;
        }
        return true;
    }
    
    
    // Tarkistaa, että kunta on validi (kuntakoodi on olemassa).
    public boolean tarkistaKunta(String kunta) {
        if(!validoija.tarkistaKunta(kunta)) {
            virheet.add("Virheellinen kuntakoodi!");
            return false;
        }
        return true;
    }
    
    // Tarkistaa, että havainnoijanumero on validi (havainnoijanumero on olemassa).
    public boolean tarkistaHavainnoija(String havainnoija) {
        SyotteenTarkastaja tarkastaja = new SyotteenTarkastaja();
        if (!tarkastaja.isANumber(havainnoija)) {
            virheet.add("Virheellinen havainnoijanumero!");
            return false;
        }
        if (tarkastaja.isANumber(havainnoija)) {
            if (!validoija.tarkistaHavainnoijanumero(Integer.parseInt(havainnoija))) {
                virheet.add("Virheellinen havainnoijanumero!");
                return false;
            }
        }
        return true;
    }
    
    // Tarkistaa, että päivämäärä on valittu.
    public boolean tarkistaPaivays(int paiva, int kuukausi, int vuosi) {
        boolean ok = true;
        if (paiva == 0) {
            virheet.add("Anna päivä!");
            ok = false;
        }
        if (kuukausi == 0) {
            virheet.add("Anna kuukausi");
            ok = false;
        }
        if (vuosi == 0) {
            virheet.add("Anna vuosi!");
            ok = false;
        }
        return ok;
    }

    // Palauttaa havainnointitapahtuman perustietoihin liittyvät virheviestit.
    public ArrayList getVirheet() {
        return virheet;
    }
    
    // Tarkistaa, että biotooppikoodi on valittu.
    public boolean validoiBiotooppikoodi(int koodi) {
        if (koodi == 0) {
            virheet.add("Anna pisteen nykyinen biotooppi!");
            return false;
        }
        return true;
    }

    // Palauttaa pisteisiin liittyvät virheet.
    public ArrayList<String> getPisteidenVirheet() {
        return pisteidenVirheet;
    }

}
